package com.zlop.model;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 需求：
 * 	有2017盏灯，从1编号到2017，初始状态都是关闭的，灯的开关每触碰一次切换一次开关状态。
 * 	此时从数字1依次递增数到2017，如果每轮灯的编号正巧可以被数的数字整除，则这盏灯的开关被触摸一次。
 * 	问最终有几盏灯是亮着的。
 *
 */
public class Lamp {
	
	/** 编号  */
	private int id;
	
	/** false-关  true-开  */
	private boolean isopen;
	
	private Lamp(int id, boolean isopen) {
		this.id = id;
		this.isopen = isopen;
	}
	
	public static List<Lamp> init(int num) {
		List<Lamp> list = new ArrayList<>(num);
		for(int i = 1; i <= num; i++){
			list.add(new Lamp(i, false));
		}
		return list;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public boolean isIsopen() {
		return isopen;
	}

	public void setIsopen(boolean isopen) {
		this.isopen = isopen;
	}

	/**
	 * 计算
	 * @param list
	 */
	public static void compute(List<Lamp> list){
		for (int i = 1, size = list.size(); i <= size; i++) {
			// 设置当前这盏灯
			list.get(i-1).setIsopen(!list.get(i-1).isIsopen());
			for (int j = 1; j <= i/2; j++) {
				if(i != j && i % j == 0){
					list.get(j-1).setIsopen(!list.get(j-1).isIsopen());
				}
			}
		}
	}
	/**
	 * 打印
	 * @param list
	 */
	public static void print(List<Lamp> list){
		list.stream().filter(f -> f.isopen).forEach(r -> {
			System.out.println(r.getId() + "亮灯");
		});
		Long count = list.stream().filter(f -> f.isopen).collect(Collectors.counting());
		System.out.println("共" + count + "盏灯");
	}
	
}
